home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #2 / Amiga Plus CD - 2004 - No. 02.iso / AmigaPlus / Tools / Development / AmigaTalk / user / Graph.st < prev    next >
Text File  |  2004-01-31  |  7KB  |  222 lines

  1. " ------------------------------------------------------------- "
  2. " Graph.st - Implementation of graph paper class for drawing    "
  3. "            functions in a window.                             "
  4. " ============================================================= "
  5. " scr    = Screen object.                                       "
  6. " win    = Window object.                                       "
  7. " ts     = Screen title (String object).                        "
  8. " tw     = Window title (String object).                        "
  9. " x      = Left edge of Window.                                 "
  10. " y      = Top  edge of Window.                                 "
  11. " w      = Width  of Window.                                    "
  12. " h      = Height of Window.                                    "
  13. " xscale = multiplier for x-coordinates (derived).              "
  14. " yscale = multiplier for y-coordinates (derived).              "
  15. " xinc   = increment size for x-coordinates.                    "
  16. " yinc   = increment size for y-coordinates.                    "
  17. " range  = Interval for x-coordinates (Xmin to Xmax).           "
  18. " domain = Interval for y-coordinates (Ymin to Ymax).           "
  19. " ------------------------------------------------------------- "
  20. " Killed a bug by adding '.' to scr open in open:from:to:       "
  21. " ------------------------------------------------------------- "
  22.  
  23. Class Graph :Painter
  24. ! scr win ts tw x y w h xscale yscale xinc yinc range domain !
  25. [
  26.   initialize: scrTitle winTitle: title  "First method to use:"
  27.     ts     <- scrTitle.
  28.     tw     <- title.
  29.  
  30.     super new: tw.     "Necessary since we use super Methods."
  31.  
  32.     range  <- Interval new.
  33.     domain <- Interval new.
  34.  
  35.     xinc   <- 0.0.
  36.     yinc   <- 0.0.
  37.  
  38.     xscale <- 1.0.
  39.     yscale <- 1.0
  40. |
  41.   setSizeFrom: orPoint to: brtPoint     "Helper method for open:from:to:"
  42.     scr setOrigin:     orPoint.
  43.     scr setScreenSize: brtPoint.
  44.  
  45.     win setWindowOrigin: orPoint.
  46.     win setWindowSize:   brtPoint.
  47.  
  48.     x <- (orPoint  x).
  49.     y <- (orPoint  y).
  50.     w <- (brtPoint x).
  51.     h <- (brtPoint y).
  52. |
  53.   open: screenMode from: oPoint to: brPoint   "Second method to use:"
  54.     scr <- Screen new.
  55.     win <- Window new: tw.
  56.     
  57.     scr openScreen: screenMode title: ts.
  58.  
  59.     self setSizeFrom: oPoint to: brPoint.
  60.     scr  setDepth: 4.
  61.  
  62.     win setFlags:     16r11800.  "RMBTRAP | ACTIVATE | BORDERLESS"
  63.     win openOnScreen: ts
  64. |
  65.   refreshGraphPaper
  66.     win refreshWindowFrame
  67. |
  68.   setPen: pen
  69.     super setAPen: pen   "<primitive 200 0 tw pen>"
  70. |
  71.   setXAxisFrom: xmin to: xmax by: deltax
  72.     range from: xmin to: xmax by: deltax.
  73.  
  74.     xinc   <- deltax.
  75.     xscale <- ((w - x) / (xmax - xmin)).
  76. |
  77.   setYAxisFrom: ymin to: ymax by: deltay
  78.     domain from: ymin to: ymax by: deltay.
  79.  
  80.     yinc   <- deltay.
  81.     yscale <- ((h - y) / (ymin - ymax))
  82. |
  83.   plotPoint: xpt y: ypt ! p !
  84.     p  <- Point new.
  85.  
  86.     p x: ((w + (xscale * (xpt - (range  last )))) rounded).
  87.     p y: ((h + (yscale * (ypt - (domain first)))) rounded).
  88.  
  89.     super drawPixelAt: p "<primitive 200 11 tw (p x) (p y)>"
  90. |
  91.   drawLine: x1 y1: y1 x2: x2 y2: y2 ! p1 p2 !
  92.     
  93.     p1 <- Point new.
  94.     p2 <- Point new.
  95.  
  96.     p1 x: ((w + (xscale * (x1 - (range  last )))) rounded).
  97.     p1 y: ((h + (yscale * (y1 - (domain first)))) rounded).
  98.     p2 x: ((w + (xscale * (x2 - (range  last )))) rounded).
  99.     p2 y: ((h + (yscale * (y2 - (domain first)))) rounded).
  100.     
  101.     "<primitive 200 6 tw (p1 x) (p1 y) (p2 x) (p2 y)>"
  102.     super drawLineFrom: p1 to: p2.
  103.  
  104.     win refreshWindowFrame
  105. |
  106.   drawXTick: xp y: yp ! p1 p2 ! "Internal method only."
  107.     p1 <- Point new.
  108.     p2 <- Point new.
  109.  
  110.     p1 x: ((w +     (xscale * (xp - (range  last )))) rounded).
  111.     p1 y: ((h + 3 + (yscale * (yp - (domain first)))) rounded).
  112.     p2 x: ((w +     (xscale * (xp - (range  last )))) rounded).
  113.     p2 y: ((h - 3 + (yscale * (yp - (domain first)))) rounded).
  114.  
  115.     "<primitive 200 6 tw (p1 x) (p1 y) (p2 x) (p2 y)>"
  116.     super drawLineFrom: p1 to: p2.
  117.  
  118.     win refreshWindowFrame
  119. |
  120.   drawYTick: xp y: yp ! p1 p2 ! "Internal method only."
  121.     p1 <- Point new.
  122.     p2 <- Point new.
  123.  
  124.     p1 x: ((w + 3 + (xscale * (xp - (range  last )))) rounded).
  125.     p1 y: ((h +     (yscale * (yp - (domain first)))) rounded).
  126.     p2 x: ((w - 3 + (xscale * (xp - (range  last )))) rounded).
  127.     p2 y: ((h +     (yscale * (yp - (domain first)))) rounded).
  128.  
  129.     "<primitive 200 6 tw (p1 x) (p1 y) (p2 x) (p2 y)>"
  130.     super drawLineFrom: p1 to: p2. 
  131.  
  132.     win refreshWindowFrame
  133. |
  134.   drawGrid: xticks y: yticks color: pen ! tsize t !
  135.     self setPen: pen.
  136.     tsize <- (range last - range first) / xticks.
  137.      
  138.     (1 to: xticks by: 1)
  139.       do: [:ix | t <- ((ix * tsize) + (range first)). "Draw vert' lines:"
  140.             self drawLine: t y1: domain last x2: t y2: domain first 
  141.           ].
  142.  
  143.     tsize <- (domain last - domain first) / yticks.
  144.     (1 to: yticks by: 1)
  145.       do: [:iy | t <- ((iy * tsize) + (domain first)).
  146.             self drawLine: range first y1: t x2: range last y2: t
  147.           ].
  148.  
  149.     win refreshWindowFrame
  150. |
  151.   drawXAxis: y0 numTicks: nticks color: pen ! tsize xt !
  152.     (domain inRange: y0)
  153.       ifTrue:  [self setPen: pen.
  154.                 self drawLine: (range first) y1: y0 
  155.                            x2: (range last)  y2: y0.
  156.  
  157.                 (nticks > 0)
  158.                   ifTrue: [tsize <- (range last - range first) / nticks.
  159.                            (1 to: nticks by: 1) 
  160.                             do: [:i | xt <- ((i * tsize) + (range first)).
  161.                                   self drawXTick: xt y: y0
  162.                                 ].
  163.                           ]
  164.                ]
  165.       ifFalse: ['X-Axis outside domain!' print].
  166.  
  167.     win refreshWindowFrame
  168. |
  169.   drawYAxis: x0 numTicks: nticks color: pen ! tsize yt !
  170.     (range inRange: x0)
  171.       ifTrue:  [self setPen: pen.
  172.                 self drawLine: x0 y1: (domain first)
  173.                            x2: x0 y2: (domain last).
  174.  
  175.                 (nticks > 0)
  176.                   ifTrue: [tsize <- (domain last - domain first) / nticks.
  177.                            (1 to: nticks by: 1) 
  178.                             do: [:i | yt <- ((i * tsize) + (domain first)).
  179.                                   self drawYTick: x0 y: yt
  180.                                 ].
  181.                           ]
  182.                ]
  183.       ifFalse: ['Y-Axis outside range!' print].
  184.  
  185.     win refreshWindowFrame
  186. |
  187.   drawLabel: labelstr at: aPoint
  188.     "<primitive 200 19 tw labelstr (aPoint x ) (aPoint y)>"
  189.     super drawText: labelstr at: aPoint.
  190.  
  191.     win refreshWindowFrame
  192. |
  193.   tellScales
  194.     ( 'Scales are:  xscale = ', xscale, ', yscale = ', -1 * yscale ) print
  195. |
  196.   tellRange
  197.     ('Range  is ', (range first asString), '<->',
  198.                    (range last  asString)) print
  199. |
  200.   tellDomain
  201.     ('Domain is ', (domain first asString), '<->',
  202.                    (domain last  asString)) print
  203. |
  204.   xScale
  205.     ^ xscale
  206. |
  207.   yScale
  208.     ^ -1 * yscale
  209. |
  210.   range
  211.     ^ ((range first asString), '<->', (range last asString))
  212. |
  213.   domain
  214.     ^ ((domain first asString), '<->', (domain last asString))
  215. |
  216.   close
  217.     win close.
  218.     scr close.
  219.  
  220.     ^ nil
  221. ]
  222.